package reflect;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注解使用 @interface 定义。这样一来，java代码中就可以使用
 * @注解名来使用这个注解了
 *
 * 注解定义时，可以使用:
 * @Target来指定注解可以作用的位置，()中用来指定具体位置，这些
 *   位置可以使用ElementType的对应常量，当需要同时作用多个不同
 *   位置时，语法为:
 *   @Target({ElementType.Method,ElementType.XXXX,...})
 *   相当与在()中使用一个数组作为参数。
 *
 * @Retention用来指定当前注解的作用范围，()中可以使用
 * RetentionPolicy来指定，有三个可选值:
 * RetentionPolicy.SOURCE
 * RetentionPolicy.CLASS(默认值)
 * RetentionPolicy.RUNTIME
 *
 * SOURCE:该注解值存在于源代码中，编译后字节码文件中不存在，
 *        这个通常是JAVA原生带的很多注解使用的作用范围。
 * CLASS:注解会被保存在字节码文件中，但是反射机制无法在运行
 *       时获取到它。
 * RUNTIME:注解会被保存在字节码中，并且运行期也可存在，我们可以
 *         通过反射机制获取并辅助反射机制对类进行相关操作。
 *         自定义的注解基本上都使用这个作用范围。
 */

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAnno {
}
